//在index.js中引入axios
import axios, { Axios, AxiosResponse, AxiosRequestConfig } from 'axios';
import { Message } from '@arco-design/web-react';

declare module 'axios' {
  interface AxiosResponse<T = any> {
    msg: string;
    // 这里追加你的参数
  }
  export function create(config?: AxiosRequestConfig): AxiosInstance;
}

//设置axios基础路径
const service = axios.create({
  baseURL: process.env.REACT_APP_BASE_URL,
  headers: {
    'Content-Type': 'application/json;charset=utf-8',

  },
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 每次发送请求之前本地存储中是否存在token，也可以通过Redux这里只演示通过本地拿到token
    // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    const token = localStorage.getItem('userToken');

    //在每次的请求中添加token
    if (token) {
      config.headers['Authorization'] = `${token}`;
    }
    return config;
  },
  (error) => {
    return error;
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 根据返回不同的状态码做不同的事情
    // 这里一定要和后台开发人员协商好统一的错误状态码

    const data = response.data;

    if (response.status) {
      switch (data.code) {
        case 1000:
          return data;
        case 1003:
          //未登录处理方法
          if (window.location.pathname.replace(/\//g, '') !== 'login') {
            window.location.pathname = '/login';
          }
          break;
        case 1001:
        case 1004:
        case 1005:
          Message.error(data.msg);
          break;
        default:
          return Promise.reject(data);
      }
    } else {
      return response;
    }
  },
  (error) => {
    Message.error(error.toString());
    return Promise.reject(error);
  }
);
//最后把封装好的axios导出
export default service;
